﻿using System.Collections.Generic;

namespace Hematology.Tools.Text
{
	public class TransliterationHelper
	{
		public enum TransliterationType
		{
			Gost,
			ISO,
			MISO
		}

		private static readonly Dictionary<string, string> Gost = new Dictionary<string, string>(); //ГОСТ 16876-71
		private static readonly Dictionary<string, string> Iso = new Dictionary<string, string>(); //ISO 9-95
		private static readonly Dictionary<string, string> Miso = new Dictionary<string, string>(); //modified ISO 9-95

		public static string Front(string text)
		{
			return Front(text, TransliterationType.ISO);
		}

		public static string Front(string text, TransliterationType type)
		{
			string output = text;
			Dictionary<string, string> tdict = GetDictionaryByType(type);

			foreach (KeyValuePair<string, string> key in tdict)
			{
				output = output.Replace(key.Key, key.Value);
			}
			return output;
		}

		public static string Back(string text)
		{
			return Back(text, TransliterationType.ISO);
		}

		public static string Back(string text, TransliterationType type)
		{
			string output = text;
			Dictionary<string, string> tdict = GetDictionaryByType(type);

			foreach (KeyValuePair<string, string> key in tdict)
			{
				output = output.Replace(key.Value, key.Key);
			}
			return output;
		}

		private static Dictionary<string, string> GetDictionaryByType(TransliterationType type)
		{
			Dictionary<string, string> tdict = new Dictionary<string, string>();
			if (type == TransliterationType.Gost) tdict = Gost;
			else if (type == TransliterationType.ISO) tdict = Iso;
			else if (type == TransliterationType.MISO) tdict = Miso;
			return tdict;
		}

		static TransliterationHelper()
		{
			#region GOST

			Gost.Add("Є", "EH");
			Gost.Add("І", "I");
			Gost.Add("і", "i");
			Gost.Add("№", "#");
			Gost.Add("є", "eh");
			Gost.Add("А", "A");
			Gost.Add("Б", "B");
			Gost.Add("В", "V");
			Gost.Add("Г", "G");
			Gost.Add("Д", "D");
			Gost.Add("Е", "E");
			Gost.Add("Ё", "JO");
			Gost.Add("Ж", "ZH");
			Gost.Add("З", "Z");
			Gost.Add("И", "I");
			Gost.Add("Й", "JJ");
			Gost.Add("К", "K");
			Gost.Add("Л", "L");
			Gost.Add("М", "M");
			Gost.Add("Н", "N");
			Gost.Add("О", "O");
			Gost.Add("П", "P");
			Gost.Add("Р", "R");
			Gost.Add("С", "S");
			Gost.Add("Т", "T");
			Gost.Add("У", "U");
			Gost.Add("Ф", "F");
			Gost.Add("Х", "KH");
			Gost.Add("Ц", "C");
			Gost.Add("Ч", "CH");
			Gost.Add("Ш", "SH");
			Gost.Add("Щ", "SHH");
			Gost.Add("Ъ", "'");
			Gost.Add("Ы", "Y");
			Gost.Add("Ь", "");
			Gost.Add("Э", "EH");
			Gost.Add("Ю", "YU");
			Gost.Add("Я", "YA");
			Gost.Add("а", "a");
			Gost.Add("б", "b");
			Gost.Add("в", "v");
			Gost.Add("г", "g");
			Gost.Add("д", "d");
			Gost.Add("е", "e");
			Gost.Add("ё", "jo");
			Gost.Add("ж", "zh");
			Gost.Add("з", "z");
			Gost.Add("и", "i");
			Gost.Add("й", "jj");
			Gost.Add("к", "k");
			Gost.Add("л", "l");
			Gost.Add("м", "m");
			Gost.Add("н", "n");
			Gost.Add("о", "o");
			Gost.Add("п", "p");
			Gost.Add("р", "r");
			Gost.Add("с", "s");
			Gost.Add("т", "t");
			Gost.Add("у", "u");
			Gost.Add("ф", "f");
			Gost.Add("х", "kh");
			Gost.Add("ц", "c");
			Gost.Add("ч", "ch");
			Gost.Add("ш", "sh");
			Gost.Add("щ", "shh");
			Gost.Add("ъ", "");
			Gost.Add("ы", "y");
			Gost.Add("ь", "");
			Gost.Add("э", "eh");
			Gost.Add("ю", "yu");
			Gost.Add("я", "ya");
			Gost.Add("«", "");
			Gost.Add("»", "");
			Gost.Add("—", "-");

			#endregion

			#region ISO

			Iso.Add("Є", "Ye");
			Iso.Add("І", "I");
			Iso.Add("Ѓ", "G");
			Iso.Add("і", "i");
			Iso.Add("№", "#");
			Iso.Add("є", "ye");
			Iso.Add("ѓ", "g");
			Iso.Add("А", "A");
			Iso.Add("Б", "B");
			Iso.Add("В", "V");
			Iso.Add("Г", "G");
			Iso.Add("Д", "D");
			Iso.Add("Е", "E");
			Iso.Add("Ё", "Yo");
			Iso.Add("Ж", "Zh");
			Iso.Add("З", "Z");
			Iso.Add("И", "I");
			Iso.Add("Й", "J");
			Iso.Add("К", "K");
			Iso.Add("Л", "L");
			Iso.Add("М", "M");
			Iso.Add("Н", "N");
			Iso.Add("О", "O");
			Iso.Add("П", "P");
			Iso.Add("Р", "R");
			Iso.Add("С", "S");
			Iso.Add("Т", "T");
			Iso.Add("У", "U");
			Iso.Add("Ф", "F");
			Iso.Add("Х", "X");
			Iso.Add("Ц", "C");
			Iso.Add("Ч", "Ch");
			Iso.Add("Ш", "Sh");
			Iso.Add("Щ", "Shh");
			Iso.Add("Ъ", "'");
			Iso.Add("Ы", "Y");
			Iso.Add("Ь", "");
			Iso.Add("Э", "E");
			Iso.Add("Ю", "Yu");
			Iso.Add("Я", "Ya");
			Iso.Add("а", "a");
			Iso.Add("б", "b");
			Iso.Add("в", "v");
			Iso.Add("г", "g");
			Iso.Add("д", "d");
			Iso.Add("е", "e");
			Iso.Add("ё", "yo");
			Iso.Add("ж", "zh");
			Iso.Add("з", "z");
			Iso.Add("и", "i");
			Iso.Add("й", "j");
			Iso.Add("к", "k");
			Iso.Add("л", "l");
			Iso.Add("м", "m");
			Iso.Add("н", "n");
			Iso.Add("о", "o");
			Iso.Add("п", "p");
			Iso.Add("р", "r");
			Iso.Add("с", "s");
			Iso.Add("т", "t");
			Iso.Add("у", "u");
			Iso.Add("ф", "f");
			Iso.Add("х", "x");
			Iso.Add("ц", "c");
			Iso.Add("ч", "ch");
			Iso.Add("ш", "sh");
			Iso.Add("щ", "shh");
			Iso.Add("ъ", "");
			Iso.Add("ы", "y");
			Iso.Add("ь", "");
			Iso.Add("э", "e");
			Iso.Add("ю", "yu");
			Iso.Add("я", "ya");
			Iso.Add("«", "");
			Iso.Add("»", "");
			Iso.Add("—", "-");
			Iso.Add("\\", "");
			Iso.Add("/", "");
			Iso.Add(":", "");
			Iso.Add("*", "");
			Iso.Add("?", "");
			Iso.Add("\"", "");
			Iso.Add("<", "");
			Iso.Add(">", "");
			Iso.Add("|", "");
			Iso.Add("'", "");
			Iso.Add("`", "");
			Iso.Add(" ", "-");

			#endregion

			#region mISO

			Miso.Add("Є", "YE");
			Miso.Add("І", "I");
			Miso.Add("Ѓ", "G");
			Miso.Add("і", "i");
			Miso.Add("№", "#");
			Miso.Add("є", "ye");
			Miso.Add("ѓ", "g");
			Miso.Add("А", "A");
			Miso.Add("Б", "B");
			Miso.Add("В", "V");
			Miso.Add("Г", "G");
			Miso.Add("Д", "D");
			Miso.Add("Е", "E");
			Miso.Add("Ё", "Yo");
			Miso.Add("Ж", "Zh");
			Miso.Add("З", "Z");
			Miso.Add("И", "I");
			Miso.Add("Й", "J");
			Miso.Add("К", "K");
			Miso.Add("Л", "L");
			Miso.Add("М", "M");
			Miso.Add("Н", "N");
			Miso.Add("О", "O");
			Miso.Add("П", "P");
			Miso.Add("Р", "R");
			Miso.Add("С", "S");
			Miso.Add("Т", "T");
			Miso.Add("У", "U");
			Miso.Add("Ф", "F");
			Miso.Add("Х", "X");
			Miso.Add("Ц", "C");
			Miso.Add("Ч", "Ch");
			Miso.Add("Ш", "Sh");
			Miso.Add("Щ", "Shh");
			Miso.Add("Ъ", "'");
			Miso.Add("Ы", "Y");
			Miso.Add("Ь", "");
			Miso.Add("Э", "E");
			Miso.Add("Ю", "Yu");
			Miso.Add("Я", "Ya");
			Miso.Add("а", "a");
			Miso.Add("б", "b");
			Miso.Add("в", "v");
			Miso.Add("г", "g");
			Miso.Add("д", "d");
			Miso.Add("е", "e");
			Miso.Add("ё", "yo");
			Miso.Add("ж", "zh");
			Miso.Add("з", "z");
			Miso.Add("и", "i");
			Miso.Add("й", "j");
			Miso.Add("к", "k");
			Miso.Add("л", "l");
			Miso.Add("м", "m");
			Miso.Add("н", "n");
			Miso.Add("о", "o");
			Miso.Add("п", "p");
			Miso.Add("р", "r");
			Miso.Add("с", "s");
			Miso.Add("т", "t");
			Miso.Add("у", "u");
			Miso.Add("ф", "f");
			Miso.Add("х", "x");
			Miso.Add("ц", "c");
			Miso.Add("ч", "ch");
			Miso.Add("ш", "sh");
			Miso.Add("щ", "shh");
			Miso.Add("ъ", "");
			Miso.Add("ы", "y");
			Miso.Add("ь", "");
			Miso.Add("э", "e");
			Miso.Add("ю", "yu");
			Miso.Add("я", "ya");
			Miso.Add("«", "");
			Miso.Add("»", "");
			Miso.Add("—", "-");
			Miso.Add("\\", "");
			Miso.Add("/", "");
			Miso.Add(":", "");
			Miso.Add("*", "");
			Miso.Add("?", "");
			Miso.Add("\"", "");
			Miso.Add("<", "");
			Miso.Add(">", "");
			Miso.Add("|", "");
			Miso.Add("'", "");
			Miso.Add("`", "");

			#endregion
		}
    
	}
}